A defining word called flasher:

The format is as follows:
    row column s" Game Over Sucker!"  flasher: gameOver

Where row and column are the screen location to display the
string. The above example creates a word called gameOver that
when called will display Game Over Sucker!
The next time the word is called it will display an inverted
version. The next time a normal version and so on.

The created words are laid out as follows:

Byte offset: 0   1    2     3    4....  n...
            scraddr flag  strlen string invertedstring
            
The non-inverted string is stored as a packed string, ready to
be un-packed with COUNT. The inverted string is stored right
after the normal string, with no count byte. 

: flasher: ( row column addr len -- )
    create 
    >r >r                               \ move addr & len out of the way
    swap xmax * + ,                     \ calculate and store screen address
    0 c,                                \ inverted flag
    r> r> dup c,                        \ length of string (byte)
    2dup here swap cmove dup allot      \ copy string
    0 do dup i + c@ 96 + c, loop drop   \ copy inverted string 
    align does> ( -- pfa )              \ children runtime code 
    >r                                  \ save pfa
    r@ @                                \ scraddr
    r@ 3 + count                        \ scraddr straddr len
    r@ 2+ c@ if dup >r + r> then        \ select inverted/non-inverted
    vmbw                                \ display the string
    r> 2+ dup c@ not swap c! ;          \ flip inverted flag 
    
    
Scrunched Version:
------------------
: flasher: ( row column addr len -- )
    create  >r >r  swap xmax * + ,  0 c,  r> r> dup c, 
    2dup here swap cmove dup allot
    0 do dup i + c@ 96 + c, loop drop align 
    does> >r r@ @ r@ 3 + count  r@ 2+ c@ if dup >r + r> then 
    vmbw  r> 2+ dup c@ not swap c! ; 

( Test Code )
 0  0 s" I'M A FLASHER!" flasher:  f0
 1  1 s" I'M A FLASHER!" flasher:  f1
 2  2 s" I'M A FLASHER!" flasher:  f2
 3  3 s" I'M A FLASHER!" flasher:  f3 
 4  4 s" I'M A FLASHER!" flasher:  f4
 5  5 s" I'M A FLASHER!" flasher:  f5
 6  6 s" I'M A FLASHER!" flasher:  f6
 7  7 s" I'M A FLASHER!" flasher:  f7
 8  8 s" I'M A FLASHER!" flasher:  f8
 9  9 s" I'M A FLASHER!" flasher:  f9
10 10 s" I'M A FLASHER!" flasher: f10
11 11 s" I'M A FLASHER!" flasher: f11
12 12 s" I'M A FLASHER!" flasher: f12
13 13 s" I'M A FLASHER!" flasher: f13
14 14 s" I'M A FLASHER!" flasher: f14
15 15 s" I'M A FLASHER!" flasher: f15
16 16 s" I'M A FLASHER!" flasher: f16
17 17 s" I'M A FLASHER!" flasher: f17
18 18 s" I'M A FLASHER!" flasher: f18
19 19 s" I'M A FLASHER!" flasher: f19
20 20 s" I'M A FLASHER!" flasher: f20
21 21 s" I'M A FLASHER!" flasher: f21
22 22 s" I'M A FLASHER!" flasher: f22
23 23 s" I'M A FLASHER!" flasher: f23
: test ( delay -- )
    page
    50 0 do
         f0  f1  f2  f3  f4  f5  f6  f7
         f8  f9 f10 f11 f12 f13 f14 f15
        f16 f17 f18 f19 f20 f21 f22 f23
        dup 0 do loop
    loop drop ;
    
3000 test
